/*
 * Copyright (c) 2020, Armink, <armink.ztl@gmail.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <string.h>
#include <fal.h>
//#include <stm32f1xx.h>
/*#############################################*/
#include "types.h"
#include "flash.h"
//#include "machine.h"
#include "log.h"
#include "fal_cfg.h"
//#include "wdog.h"
/*#############################################*/

#ifndef FAL_USING_SFUD_PORT

#define PAGE_SIZE     4096

/**
* @fn  
* @brief 
* @param   
* @return   */
static int init(void)
{
    /* do nothing now */
    return 1;
}

/**
* @fn  
* @brief 
* @param   
* @return   */
static int  __ATTR_SECTION_SRAM__ read(long offset, uint8_t *buf, size_t size)
{
    uint32_t addr = cst92f25_onchip_flash.addr + offset;
    //LOG("%s:addr %lu \r\n",__FUNCTION__ , addr);
    HalFlashRead(addr, buf, size);
    return size;
}

/**
* @fn  
* @brief 
* @param   
* @return   */
static int __ATTR_SECTION_SRAM__ write(long offset, const uint8_t *buf, size_t size)
{
    uint32_t addr = cst92f25_onchip_flash.addr + offset;
    //vWatchDogFeed();
    HalFlashWrite(addr, (uint8*)buf, size);
    return size;
}

/**
* @fn  
* @brief 
* @param   
* @return   */
static int __ATTR_SECTION_SRAM__ erase(long offset, size_t size)
{
    uint32_t addr = cst92f25_onchip_flash.addr + offset;

    /*> Get number of page.*/
    uint16 uNbpage = (size + PAGE_SIZE -1 ) / PAGE_SIZE;

    for(uint16 i=0 ; i< uNbpage ; i++){
        LOG("[Function]%s:addr 0x%X \r\n",__FUNCTION__ , addr);
        //vWatchDogFeed();
        HalFlashErase((addr>>12)  + i );
    }

    return size;
}

/*
  "stm32_onchip" : Flash 设备的名字。
  0x08000000: 对 Flash 操作的起始地址。
  1024*1024：Flash 的总大小（1MB）。
  128*1024：Flash 块/扇区大小（因为 STM32F2 各块大小不均匀，所以擦除粒度为最大块的大小：128K）。
  {init, read, write, erase} ：Flash 的操作函数。 如果没有 init 初始化过程，第一个操作函数位置可以置空。
  8 : 设置写粒度，单位 bit， 0 表示未生效（默认值为 0 ），该成员是 fal 版本大于 0.4.0 的新增成员。各个 flash 写入粒度不尽相同，可通过该成员进行设置，以下列举几种常见 Flash 写粒度：
  nor flash:  1 bit
  stm32f2/f4: 8 bit
  stm32f1:    32 bit
  stm32l4:    64 bit
 */
//1.定义 flash 设备
const struct fal_flash_dev cst92f25_onchip_flash =
{
    .name       = "myFlash",
    .addr       = 0x00000000,
    .len        = 512*1024,
    .blk_size   = PAGE_SIZE,
    .ops        = {init, read, write, erase},
    .write_gran = 32
};

#endif


